const nmea = require('nmea-simple')
const sendPositionMsg = require('./sendPermutation.js')

/* 全局储存变量 */
let isValidSend = true // 发送锁,当FKI限制频率未到时
let sendCount = 0 // 当未发送进入PWI时,计数+1,当大于70则将isValidSend锁设置true
let timer = null // 根据FKI的剩余时间设置定时器,时间到isValidSend设置true
let sendMsg = {
	date: '', // 日期 2023/12/15
	time: '', // 事件 19:09:50
	weidu: '', // 纬度
	jingdu: '', // 经度
	speed: '', // 对地速度
	hangxiang: '', // 航向
	fMode: '', // 定位模式看是否为差分A=自主定位，D=差分，E=估算，N=数据无效
	altitude: '', // 海拔
	height: '', // 地球椭球面相对大地水准面高度
	wxCount: '', // 当前卫星数量
	type: '', // 当前定位状态fix是单点
	fuyang: '', // 俯仰角
	gundong: '', // 滚动角
	hangxiangJiao: '', // 航向角
	id: '1', // 航空器id
}
let sendMsgList = []

/* 解析wit */
function mainParse(data) {
	// 1.取其指令标识，这里取$WTRTK进行处理，单独去掉$PPPNAVA
	const str = data.toString()
	const head = str.split(',')[0].replace('#', '$').trim()
	if (head === '$WTRTK') {
		const strArray = str.split(',')
		sendMsg.fuyang = strArray[5]
		sendMsg.gundong = strArray[6]
		sendMsg.hangxiangJiao = strArray[7]
	} else if (head === '$PPPNAVA') {
	} else {
		try {
			const packet = nmea.parseNmeaSentence(str)
			if (packet.sentenceId === 'RMC' && packet.status === 'valid') {
				// 取数据
				const timeObj = new Date(packet.datetime)
				sendMsg.date = timeObj.toLocaleDateString()
				sendMsg.time = timeObj.toLocaleTimeString()
				sendMsg.weidu = packet.latitude
				sendMsg.jingdu = packet.longitude
				sendMsg.speed = packet.speedKnots
				sendMsg.hangxiang = packet.trackTrue
				// 定位模式看是否为差分A=自主定位，D=差分，E=估算，N=数据无效
				sendMsg.fMode = packet.faaMode
			}
			if (packet.sentenceId === 'GGA' && packet.fixType !== 'none') {
				sendMsg.altitude = packet.altitudeMeters
				sendMsg.height = packet.geoidalSeperation // 地球椭球面相对大地水准面高度
				sendMsg.wxCount = packet.satellitesInView // 卫星数量
				// 单点定位='fix',
				sendMsg.type = packet.fixType // 定位状态
			}
		} catch (error) {
			console.error('错误packet解析:', str, error)
		}
	}
}

/* 解析bd */
const sendSimId = '1002008'
/* 分命令解析bd设备指令 */
function parseBDPWI(str, port) {
	if (str[1] !== '000000.00' && parseInt(str[4]) >= 45) {
		sendCount += 1
		// 当sendMsgList没有信息时,插入一条
		if (sendMsgList.length < 2) {
			sendMsgList.push(sendPositionMsg(sendMsg))
		}
		// 在计数30次时,插入一个定位信息报文进去
		if (sendCount === 29) {
			sendMsgList.push(sendPositionMsg(sendMsg))
			if (sendMsgList.length > 2) {
				sendMsgList.shift()
			}
		}
		// 防止无法接收FKI消息后的容错计数
		if (sendCount > 70) {
			isValidSend = true
			sendCount = 0
		}
		if (isValidSend) {
			sendMsgList.push(sendPositionMsg(sendMsg))
			if (sendMsgList.length > 2) {
				sendMsgList.shift()
			}
			// 如果发送锁解开,开始向地面发送报文
			console.log(`发送的对象数据中type字段为:${sendMsg.type}.........`)
			console.log(`给BD发生的短报文为:${sendMsgList.join('C')}`)
			port.write(`$BDTCQ,${sendSimId},1,2,2,${sendMsgList.join('C')},0*32\r\n`)
			port.drain(() => {
				console.log('BD短报文发送成功...')
				sendCount = 0
			})
		}
	}
}
function parseBDFKI(str) {
	let status = str[3]
	let statusType = str[4]
	let remainTime = parseInt(str[5]) // 剩余时间
	if (status === 'N') {
		switch (statusType) {
			case '1':
				isValidSend = false
				timer = setTimeout(() => {
					isValidSend = true
					timer = null
				}, 1000 * remainTime)
				break
			case '2':
				console.log('bd发射抑制,无法发送!')
				break
			case '3':
				console.log('bd发射静默,无法发送!')
				break
			case '4':
				console.log('bd功率未锁定,无法发送!')
				break
			case '5':
				console.log('bd未检测到IC模块信息,无法发送!')
				break
			case '6':
				console.log('bd发送的消息超过最大字节数,无法发送!')
				break
		}
	}
}
/* 解析bd主函数 */
function bdParse(data, port) {
	const str = data.toString()
	let strArray = str.split(',')
	strArray[strArray.length - 1] = strArray[strArray.length - 1].split('*')[0]
	orderCode = strArray[0].replace('$', '')
	if (orderCode === 'BDPWI') {
		parseBDPWI(strArray, port)
	} else if (orderCode === 'BDFKI') {
		parseBDFKI(strArray)
	}
}

module.exports = {
	mainParse,
	bdParse,
}
